import axios from 'axios';
import Qs from 'qs';

let sessionTicket = '';//接口请求需要在Headers中携带的参数

/**
 * 自定义axios实例/server
 * @param   {string}       baseURL              //这里可以设置环境变量切换不同环境url
 * @param   {Number}       timeout              //请求超时
 * @param   {String}       method               //请求方法,默认为get
 * @param   {Boolean}      withCredentials      //表示跨域请求是否使用凭证
 * @param   {Function}     transformRequest     //只能用在PUT，GET，POST上，向服务器发送数据前修改请求数据
 */
const server = axios.create({
    baseURL: 'http://nadmin-api.wxhand.com/admin/Phaadmin/',
    timeout: 5000,
    method: 'post',
    withCredentials: false,
    transformRequest: [function (data) {
        let resData = data;

        if(!(resData instanceof FormData)) {
            resData = Qs.stringify(resData);
        }
        return resData;
    }]
});

/**
 * 添加请求拦截器
 */
server.interceptors.request.use(function(config) {
    //发送请求之前做些什么
    config.headers['zsdx-session-ticket'] = sessionTicket;
    config.headers['Content-Type'] = 'application/x-www-form-urlencoded';

    return config;
}, function (error) {
    return Promise.reject(error);
});

/**
 * 添加响应拦截器,对响应数据做点什么
 */
server.interceptors.response.use(function(response) {
    if(response.data.code == 1001) {
        //TODO
    }
    return response;
}, function (error) {
    return Promise.reject(error);
});

/**
 * 添加请求超时拦截器
 */
server.interceptors.response.use(undefined, function axiosRetryInterceptor(err) {
    var config = err.config;

    if(!config || !config.retry) return Promise.reject(err);
    config.__retryCount = config.__retryCount || 0;
    if(config.__retryCount >= config.retry) {
        // 请求超时可以在这里这里设置跳转页面

        return Promise.reject(err);
    }
    config.__retryCount += 1;
    var backoff = new Promise(function(resolve) {
        setTimeout(function() {
            resolve();
        }, config.retryDelay || 1);
    });

    return backoff.then(function() {
        return server(config);
    });
});

/**
 * 封装GET方法
 * @param   {String}    url             //url
 * @param   {Object}    uparamsrl       //参数
 */
function get(url,params={}){
    return new Promise((resolve,reject) => {
        server.get(url,{
            params: Qs.parse(params)
        }).then(response => {
            resolve(response.data);
        }).catch(err => {
            reject(err);
        });
    });
}

/**
 * 封装POST方法
 * @param   {String}    url             //url
 * @param   {Object}    data            //参数
 */
function post(url,data = {}){
    return new Promise((resolve,reject) => {
        server.post(url,Qs.parse(data)).then(response => {
            resolve(response.data);
        },
        err => {
            reject(err);
        });
    });
}

function num (callback) {
    callback(1);
}

/**
 * 添加到vue原型上
 */
function install(Vue) {
    Vue.axios = axios;

    Object.defineProperties(Vue.prototype, {
        $post: {
            get() {
                return post.bind(this);
            }
        },
        $get: {
            get() {
                return get.bind(this);
            }
        },
        $num: {
            get () {
                return num.bind(this);
            }
        },
        axios: {
            get() {
                return axios;
            }
        },
    });
}

export default install;